{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "52203624-ecfe-4ef6-8cfc-edaa7ac7b727",
   "metadata": {},
   "source": [
    "# Python 控制结构详解\n",
    "\n",
    "控制结构是编程中用于控制程序执行流程的核心机制。Python 提供了丰富的控制结构，包括**条件语句**、**循环**、**循环控制关键字**、**嵌套控制结构**、**条件表达式**以及**异常处理**等工具。通过掌握这些结构，您可以编写能够根据条件执行不同代码、重复执行任务并处理复杂逻辑的程序。本文将尽可能详细地讲解这些知识点，每个部分都包含定义、语法、讲解、示例代码（带注释）、以及练习，帮助您全面理解和应用 Python 的控制结构。\n",
    "\n",
    "---\n",
    "\n",
    "## 1. 条件语句\n",
    "\n",
    "条件语句允许程序根据特定条件决定执行哪些代码块。Python 使用 `if`、`elif` 和 `else` 关键字来实现条件判断。\n",
    "\n",
    "### 1.1 `if` 语句\n",
    "\n",
    "- **作用**：当条件为真（`True`）时，执行 `if` 块中的代码。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  if 条件:\n",
    "      # 代码块\n",
    "  ```\n",
    "\n",
    "- **讲解**：\n",
    "\n",
    "  - 条件是一个返回布尔值（`True` 或 `False`）的表达式。\n",
    "  - Python 使用缩进来定义代码块，缩进通常是 4 个空格。\n",
    "  - 如果条件为假，则跳过 `if` 块，继续执行后续代码。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4cf75dd7-3422-4f27-80d1-30bb8deab155",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查一个数字是否为正数\n",
    "number = 5\n",
    "if number > 0:\n",
    "    print(\"这是一个正数\")  # 输出: 这是一个正数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b7055a7-3f54-4367-b27d-3e470b2035f8",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `number > 0` 是一个条件表达式，返回 `True`。\n",
    "  - 因为条件为真，`print` 语句被执行。\n",
    "\n",
    "### 1.2 `elif` 语句\n",
    "\n",
    "- **作用**：表示“else if”，用于在 `if` 条件不满足时检查另一个条件。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  if 条件1:\n",
    "      # 代码块1\n",
    "  elif 条件2:\n",
    "      # 代码块2\n",
    "  ```\n",
    "\n",
    "- **讲解**：\n",
    "\n",
    "  - `elif` 必须跟在 `if` 或另一个 `elif` 之后。\n",
    "  - 可以有多个 `elif`，按顺序检查条件。\n",
    "  - 一旦某个条件为真，后续的 `elif` 将被跳过。\n",
    "\n",
    "### 1.3 `else` 语句\n",
    "\n",
    "- **作用**：当所有前面的 `if` 和 `elif` 条件都不满足时，执行 `else` 块中的代码。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  if 条件:\n",
    "      # 代码块1\n",
    "  else:\n",
    "      # 代码块2\n",
    "  ```\n",
    "\n",
    "- **讲解**：\n",
    "\n",
    "  - `else` 是可选的，且只能有一个。\n",
    "  - 它是条件语句的“默认”分支。\n",
    "\n",
    "#### 综合示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "5d5a961b-2537-4e60-b30c-cc89bcaed3e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "你是未成年人\n"
     ]
    }
   ],
   "source": [
    "# 根据年龄判断身份\n",
    "age = 16\n",
    "\n",
    "if age < 18:\n",
    "    print(\"你是未成年人\")\n",
    "elif age == 18:\n",
    "    print(\"你刚成年\")  # 输出: 你刚成年\n",
    "else:\n",
    "    print(\"你是成年人\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a3f3cad-f755-413f-81a1-6f11cfb45513",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `age < 18` 为假，跳过第一个块。\n",
    "  - `age == 18` 为真，执行 `elif` 块，输出“你刚成年”。\n",
    "  - 因为已有条件满足，`else` 块被跳过。\n",
    "\n",
    "#### 练习\n",
    "\n",
    "1. 编写程序，判断一个数字是正数、负数还是零。\n",
    "2. 根据学生的成绩（0-100）输出等级：\n",
    "   - A: 90-100\n",
    "   - B: 80-89\n",
    "   - C: 70-79\n",
    "   - D: 60-69\n",
    "   - F: 0-59\n",
    "\n",
    "---\n",
    "\n",
    "## 2. 循环\n",
    "\n",
    "循环用于重复执行一段代码。Python 提供了两种循环：**`for` 循环**和 **`while` 循环**。\n",
    "\n",
    "### 2.1 `for` 循环\n",
    "\n",
    "- **作用**：遍历一个序列（如列表、元组、字符串）或指定范围的数字。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  for 变量 in 序列:\n",
    "      # 代码块\n",
    "  ```\n",
    "\n",
    "- **讲解**：\n",
    "\n",
    "  - `变量` 依次取序列中的每个元素。\n",
    "  - 适用于已知循环次数或需要处理序列的情况。\n",
    "\n",
    "#### 示例 1：遍历列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "39df21af-02ba-4169-bab7-0720882d1a4a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "苹果\n",
      "香蕉\n",
      "樱桃\n"
     ]
    }
   ],
   "source": [
    "fruits = [\"苹果\", \"香蕉\", \"樱桃\"]\n",
    "for fruit in fruits:\n",
    "    print(fruit)\n",
    "# 输出:\n",
    "# 苹果\n",
    "# 香蕉\n",
    "# 樱桃"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "00effb2b-022e-45df-b0ca-3768ec3ba5c5",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `fruit` 依次赋值为列表中的每个元素。\n",
    "  - 每次循环打印当前元素。\n",
    "\n",
    "#### 示例 2：使用 `range()`\n",
    "\n",
    "- **`range()` 函数**：\n",
    "  - `range(n)`：生成 0 到 n-1 的整数。\n",
    "  - `range(start, stop)`：生成 start 到 stop-1 的整数。\n",
    "  - `range(start, stop, step)`：生成 start 到 stop-1 的整数，步长为 step。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "eeccbe41-1bd4-4a5b-98df-eda27eafbb9a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "# 打印 0 到 2\n",
    "for i in range(3):\n",
    "    print(i)\n",
    "# 输出:\n",
    "# 0\n",
    "# 1\n",
    "# 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d5d09edf-7d7f-42a5-a744-5e352cdbae1d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1\n",
      "3\n",
      "5\n"
     ]
    }
   ],
   "source": [
    "# 打印 1、3、5\n",
    "for i in range(1, 6, 2):\n",
    "    print(i)\n",
    "# 输出:\n",
    "# 1\n",
    "# 3\n",
    "# 5"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4815edd-ecda-4e0c-90ce-3e7251b5e3ae",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `range(1, 6, 2)` 从 1 开始，到 5 结束（不含 6），步长为 2。\n",
    "\n",
    "### 2.2 `while` 循环\n",
    "\n",
    "- **作用**：在条件为真（`True`）时持续执行代码块。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  while 条件:\n",
    "      # 代码块\n",
    "  ```\n",
    "\n",
    "- **讲解**：\n",
    "\n",
    "  - 每次循环开始时检查条件。\n",
    "  - 如果条件为假，循环结束。\n",
    "  - 适用于不确定循环次数、需满足条件时的情况。\n",
    "\n",
    "#### "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9e409520-307d-4e20-97c2-1ee2a65aefeb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "计数为 0\n",
      "计数为 1\n",
      "计数为 2\n",
      "计数为 3\n",
      "计数为 4\n"
     ]
    }
   ],
   "source": [
    "# 打印 0 到 4\n",
    "count = 0\n",
    "while count < 5:\n",
    "    print(\"计数为\", count)\n",
    "    count += 1  # 递增 count，否则会导致无限循环\n",
    "# 输出:\n",
    "# 计数为 0\n",
    "# 计数为 1\n",
    "# 计数为 2\n",
    "# 计数为 3\n",
    "# 计数为 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f112330-55f5-43f0-95c8-7c46e5dd00ad",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `count += 1` 确保条件最终变为假，避免无限循环。\n",
    "\n",
    "#### 练习\n",
    "\n",
    "1. 使用 `for` 循环打印 1 到 10。\n",
    "2. 使用 `while` 循环计算 1 到 100 的和。\n",
    "3. 使用 `for` 循环遍历列表 `[10, 20, 30, 40]`，打印每个元素的索引和值。\n",
    "\n",
    "---\n",
    "\n",
    "## 3. 循环控制关键字\n",
    "\n",
    "Python 提供了 **`break`**、**`continue`** 和 **`pass`** 来控制循环的行为。\n",
    "\n",
    "### 3.1 `break`\n",
    "\n",
    "- **作用**：立即终止整个循环。\n",
    "- **讲解**：即使循环条件仍为真，`break` 会强制退出循环。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a5146ded-3d59-4680-94a7-22da4b28d9ae",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    if i == 5:\n",
    "        break  # 当 i == 5 时退出循环\n",
    "    print(i)\n",
    "# 输出:\n",
    "# 0\n",
    "# 1\n",
    "# 2\n",
    "# 3\n",
    "# 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ac9fdc6-0cc8-4398-a2ee-8584b8609ab1",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - 当 `i` 达到 5 时，`break` 执行，循环停止。\n",
    "\n",
    "### 3.2 `continue`\n",
    "\n",
    "- **作用**：跳过当前循环的剩余代码，进入下一次循环。\n",
    "- **讲解**：适用于需要跳过某些迭代的情况。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "5ebf4a43-e7c3-40a6-ae5e-24d8d67d1cd3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "for i in range(5):\n",
    "    if i == 2:\n",
    "        continue  # 跳过 i == 2 的迭代\n",
    "    print(i)\n",
    "# 输出:\n",
    "# 0\n",
    "# 1\n",
    "# 3\n",
    "# 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31f81480-c480-4776-8093-7a8b7c1c10d7",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - 当 `i == 2` 时，`continue` 跳过 `print`，直接进入下一次循环。\n",
    "\n",
    "### 3.3 `pass`\n",
    "\n",
    "- **作用**：占位符，不执行任何操作。\n",
    "- **讲解**：用于语法上需要语句但暂无具体逻辑时。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "3afab033-b673-40a6-b545-447e53db1bf0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "for i in range(5):\n",
    "    if i == 3:\n",
    "        pass  # 什么都不做\n",
    "    else:\n",
    "        print(i)\n",
    "# 输出:\n",
    "# 0\n",
    "# 1\n",
    "# 2\n",
    "# 4"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "225bd880-88bc-41cd-93b1-d5982088c5d4",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - `pass` 在 `i == 3` 时不起作用，仅占位。\n",
    "\n",
    "#### 练习\n",
    "\n",
    "1. 使用 `while` 循环从 1 累加到 100，跳过能被 3 整除的数。\n",
    "2. 使用 `for` 循环遍历列表 `[\"a\", \"b\", \"c\", \"d\"]`，遇到 `\"c\"` 时终止循环。\n",
    "\n",
    "---\n",
    "\n",
    "## 4. 嵌套控制结构\n",
    "\n",
    "控制结构可以嵌套，用于处理更复杂的逻辑。\n",
    "\n",
    "### 4.1 嵌套 `if` 语句\n",
    "\n",
    "- **作用**：在条件语句中再使用条件语句。\n",
    "- **讲解**：适用于多层次条件判断。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "fc207340-4b04-4ad6-bb49-15ac116b3822",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "成年女性\n"
     ]
    }
   ],
   "source": [
    "age = 20\n",
    "gender = \"女\"\n",
    "\n",
    "if age >= 18:\n",
    "    if gender == \"女\":\n",
    "        print(\"成年女性\")  # 输出: 成年女性\n",
    "    else:\n",
    "        print(\"成年男性\")\n",
    "else:\n",
    "    print(\"未成年人\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce78dd1d-e271-4c3d-888e-1c2d5aafe97f",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - 外层检查 `age >= 18`，内层检查 `gender`。\n",
    "\n",
    "### 4.2 嵌套循环\n",
    "\n",
    "- **作用**：在一个循环内嵌套另一个循环。\n",
    "- **讲解**：常用于处理多维数据（如矩阵）。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "3170361a-9e63-4376-bb7c-ef4231a89338",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i=0, j=0\n",
      "i=0, j=1\n",
      "i=1, j=0\n",
      "i=1, j=1\n",
      "i=2, j=0\n",
      "i=2, j=1\n"
     ]
    }
   ],
   "source": [
    "for i in range(3):\n",
    "    for j in range(2):\n",
    "        print(f\"i={i}, j={j}\")\n",
    "# 输出:\n",
    "# i=0, j=0\n",
    "# i=0, j=1\n",
    "# i=1, j=0\n",
    "# i=1, j=1\n",
    "# i=2, j=0\n",
    "# i=2, j=1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "293c8d64-3bc0-4380-bcee-5a902f72a845",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - 外层循环 3 次，内层每次循环 2 次，共 3 × 2 = 6 次。\n",
    "\n",
    "#### 练习\n",
    "\n",
    "1. 打印 1 到 5 的乘法表（例如 `1 × 1 = 1`）。\n",
    "2. 遍历嵌套列表 `[[1, 2], [3, 4]]`，打印每个元素。\n",
    "\n",
    "---\n",
    "\n",
    "## 5. 条件表达式（三元运算符）\n",
    "\n",
    "- **作用**：在一行中根据条件选择值。\n",
    "\n",
    "- **语法**：\n",
    "\n",
    "  ```python\n",
    "  value_if_true if 条件 else value_if_false\n",
    "  ```\n",
    "\n",
    "- **讲解**：是 `if-else` 的简洁替代。\n",
    "\n",
    "#### 示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "3dbe28da-4116-46a9-bed2-a703d006ca6b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "成年\n"
     ]
    }
   ],
   "source": [
    "age = 20\n",
    "status = \"成年\" if age >= 18 else \"未成年\"\n",
    "print(status)  # 输出: 成年"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7ae5ff1-fee2-4dd8-923b-ac04c52d76d2",
   "metadata": {},
   "source": [
    "- **注释**：\n",
    "  - 如果 `age >= 18` 为真，`status` 赋值为“成年”，否则为“未成年”。\n",
    "\n",
    "#### 练习\n",
    "\n",
    "1. 使用条件表达式判断数字是偶数还是奇数，打印结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "677f8b06-bc23-4a2a-a700-9b92a2c9dbfa",
   "metadata": {},
   "source": [
    "## 6. 综合练习\n",
    "\n",
    "1. **猜数字游戏**：\n",
    "   - 随机生成 1 到 100 的数字（使用 `import random; num = random.randint(1, 100)`）。\n",
    "   - 用户猜测并提示“太高”、“太低”或“正确”。\n",
    "   - 记录猜测次数并在猜对时显示。\n",
    "\n",
    "2. **打印质数**：\n",
    "   - 打印 1 到 100 的所有质数。\n",
    "\n",
    "3. **矩阵转置**：\n",
    "   - 给定矩阵 `[[1, 2, 3], [4, 5, 6]]`，将其转置为 `[[1, 4], [2, 5], [3, 6]]`。\n",
    "\n",
    "4. **异常处理**：\n",
    "   - 编写函数，接受用户输入的两个数字，计算商，处理除以零和非数字输入的异常。\n",
    "\n",
    "---\n",
    "\n",
    "## 7. 总结\n",
    "\n",
    "- **条件语句**：`if`、`elif`、`else` 根据条件分支执行。\n",
    "- **循环**：\n",
    "  - `for`：遍历序列或指定次数。\n",
    "  - `while`：条件为真时持续执行。\n",
    "- **循环控制**：`break` 退出，`continue` 跳过，`pass` 占位。\n",
    "- **嵌套**：组合条件和循环解决复杂问题。\n",
    "- **条件表达式**：简洁的条件判断。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "06cd2d7c-616b-4577-9e92-03d736e1d4b2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
